<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html lang="zh-CN"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="Content-Language" content="zh-CN"><link href="stylesheet.css" media="all" rel="stylesheet" type="text/css">
<title>系统字段</title>
<script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>
</head><body class="SECT1">
<div>
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><th colspan="5" align="center" valign="bottom">PostgreSQL 8.2.3 中文文档</th></tr>
<tr><td width="10%" align="left" valign="top"><a href="ddl-constraints.html" accesskey="P">后退</a></td><td width="10%" align="left" valign="top"><a href="ddl.html">快退</a></td><td width="60%" align="center" valign="bottom">章5. 数据定义</td><td width="10%" align="right" valign="top"><a href="ddl.html">快进</a></td><td width="10%" align="right" valign="top"><a href="ddl-alter.html" accesskey="N">前进</a></td></tr>
</table>
<hr align="LEFT" width="100%"></div>
<div class="SECT1"><h1 class="SECT1"><a name="DDL-SYSTEM-COLUMNS">5.4. 系统字段</a></h1>
<p>每个表都有几个<i class="FIRSTTERM">系统字段</i>，这些字段是由系统隐含定义的。因此，这些名字不能用于用户定义的字段名。请注意这些限制与这个名字是否关键字无关，把名字用引号括起来并不能让你逃离这些限制。你实际上不需要注意这些字段，只要知道它们存在就可以了。</p>
<a name="AEN2164"></a>
<div class="VARIABLELIST">
<dl>
<dt><tt class="STRUCTFIELD">oid</tt></dt>
<dd><p><a name="AEN2173"></a>行对象标识符(对象ID)。这个字段只有在创建表的时候使用了 <tt class="LITERAL">WITH OIDS</tt> 或者是配置参数 <a href="runtime-config-compatible.html#GUC-DEFAULT-WITH-OIDS">default_with_oids</a> 的值为真时出现。这个字段的类型是 <tt class="TYPE">oid</tt>(和字段同名)。参阅<a href="datatype-oid.html">节8.12</a>获取有关这种类型的更多信息。</p></dd>
<dt><tt class="STRUCTFIELD">tableoid</tt></dt>
<dd><a name="AEN2184"></a>
<p>包含本行的表的 OID 。这个字段对那些从继承层次中选取的查询特别有用(参阅<a href="ddl-inherit.html">节5.8</a>)，因为如果没有它的话，我们就很难说明一行来自哪个独立的表。<tt class="STRUCTFIELD">tableoid</tt> 可以和 <tt class="STRUCTNAME">pg_class</tt> 的 <tt class="STRUCTFIELD">oid</tt> 字段连接起来获取表名字。</p></dd>
<dt><tt class="STRUCTFIELD">xmin</tt></dt>
<dd><a name="AEN2195"></a>
<p>插入该行版本的事务标识(事务ID)。注意：在这个环境里，一个行版本是一行的一个状态；一行的每次更新都为同一个逻辑行创建一个新的行版本。</p></dd>
<dt><tt class="STRUCTFIELD">cmin</tt></dt>
<dd><a name="AEN2202"></a>
<p>在插入事务内部的命令标识(从零开始)。</p></dd>
<dt><tt class="STRUCTFIELD">xmax</tt></dt>
<dd><a name="AEN2209"></a>
<p>删除事务的标识(事务ID)，如果不是被删除的行版本，那么是零。在一个可见行版本里，这个字段有可能是非零。这通常意味着删除事务还没有提交，或者是一个删除的企图被回滚掉了。</p></dd>
<dt><tt class="STRUCTFIELD">cmax</tt></dt>
<dd><a name="AEN2216"></a>
<p>删除事务内部的命令标识符，或者是零。</p></dd>
<dt><tt class="STRUCTFIELD">ctid</tt></dt>
<dd><a name="AEN2223"></a>
<p>一个行版本在它所处的表内的物理位置。请注意，尽管 <tt class="STRUCTFIELD">ctid</tt> 可以用于非常快速地定位行版本，但每次 <tt class="COMMAND">VACUUM FULL</tt> 之后，一个行的 <tt class="STRUCTFIELD">ctid</tt> 都会被更新或者移动。因此 <tt class="STRUCTFIELD">ctid</tt> 是不能作为长期的行标识符的。应该使用 OID ，或者更好是用户定义的序列号，来标识一个逻辑行。</p></dd>
</dl>
</div>
<p>OID 是32位的量，是在同一个集群内通用的计数器上赋值的。对于一个大型或者长时间使用的数据库，这个计数器是有可能重叠的。因此，假定 OID 唯一是非常错误的，除非你自己采取了措施来保证它们是唯一的。如果你需要标识表中的行，我们强烈建议使用序列号生成器。不过，也可以使用 OID ，只要采取几个注意事项即可：</p>
<ul>
<li><p>在使用 OID 标识行的每个表的 OID 字段创建一个唯一约束。在唯一约束(或者唯一索引)存在的时候，系统会注意不去生成一个和现有行相同的 OID 。当然，只有在表中的数据行少于 2<SUP>32</SUP>(40亿)行的时候才是可能的，而实际上表中的行最好远比这个小，要不性能就会受影响了。</p></li>
<li><p>绝对不要假设 OID 是跨表唯一的；如果你需要全数据库范围内的标识，请使用 <tt class="STRUCTFIELD">tableoid</tt> 和行的 OID 的组合。</p></li>
<li><p>需要 OID 的表应该带着 <tt class="LITERAL">WITH OIDS</tt> 创建。从 PostgreSQL 8.1开始，<tt class="LITERAL">WITHOUT OIDS</tt> 是缺省的。</p></li>
</ul>
<p>事务标识符也是32位的量。在长时间运转的数据库里，它也可能会重叠。只要我们采取一些合适的维护步骤，这并不是很要命的问题；参阅<a href="maintenance.html">章22</a>获取细节。不过，在长时间运行的环境里(超过十亿次事务)依赖事务ID的唯一性并非明智的做法。</p>
<p>命令标识符也是32位的量。这样就在一个事务里有 2<SUP>32</SUP>(四十亿)条 SQL 命令的硬限制。在现实里这个限制应该不是什么问题，需要注意的是这个限制是 SQL 命令的条数，而不是处理的行版本的条数。</p>
</div>
<div>
<hr align="LEFT" width="100%">
<table summary="Footer navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><td width="33%" align="left" valign="top"><a href="ddl-constraints.html" accesskey="P">后退</a></td><td width="34%" align="center" valign="top"><a href="index.html" accesskey="H">首页</a></td><td width="33%" align="right" valign="top"><a href="ddl-alter.html" accesskey="N">前进</a></td></tr>
<tr><td width="33%" align="left" valign="top">约束</td><td width="34%" align="center" valign="top"><a href="ddl.html" accesskey="U">上一级</a></td><td width="33%" align="right" valign="top">修改表</td></tr>
</table>
</div>
</body></html>